package com.wn.sk.product.core.service.impl;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.wn.sk.product.core.contant.RedisContents;
import com.wn.sk.product.core.entity.Product;
import com.wn.sk.product.core.entity.PromotionStatus;
import com.wn.sk.product.core.vo.SeckillVo;
import com.wn.sk.product.core.mapper.ProductMapper;
import com.wn.sk.product.core.service.IProductService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
 * <p>
 * 商品表 服务实现类
 * </p>
 *
 * @author yellow docker
 * @since 2022-09-02
 */
@Service
@Slf4j
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService {

    @Autowired
    private  ProductMapper productMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 操作 string存储到redis的模板
     */
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 查询秒杀商品的时候  需要先从 redis中查询 (redis 中 已经 提前预热数据了 )
     * @return
     */
    @Override
    public List<SeckillVo> listSkProduct() throws JsonProcessingException {

        //1. 先从Redis中获取秒杀商品列表
        //从 redis获取 list的集合数据
        List<SeckillVo> voList = redisTemplate.opsForList().range(RedisContents.PRODUCT_KILL_LIST,0,-1);

        //判断
        if (CollectionUtils.isEmpty(voList)){
            //查询数据库 （预热有问题）
            voList = baseMapper.listSkProduct(PromotionStatus.START);
            // 把查询结果从redis中获取
            redisTemplate.opsForList().leftPushAll(RedisContents.PRODUCT_KILL_LIST,voList);
        }
        return voList;

    }
    /**
     * 查询为开始的商品 信息
     * @param unStart
     * @return
     */
    @Override
    public List<SeckillVo> findSeckillByStatus(Integer unStart) {
        return productMapper.listSkProduct(PromotionStatus.UN_START);
    }

    // 缓存注解
    // 查询第一次从数据中查询 把查询结果存储到redis中
    // 后面的查询从redis中获取
    // value  是缓存中的名称
    // key    缓存中的key
    //redis中的key=value + key
    //redis中的key="product:seckill" +"list"
    // key 如果key 是字符串需要用'' 包裹
//    @Cacheable(value = "product:seckill",key = "'list'")
//    @Override
//    public List<SeckillVo> listSkProduct() {
//
//        return productMapper.listSkProduct(PromotionStatus.START);
//
//    }
}
